/*
* 
* Fichier source projet intel Acceler8 sous license GNU GPL v3.
* Voir http://www.gnu.org/copyleft/gpl.html pour plus d'informations
* La license est egalement disponible dans le repertoire /doc
* 
* Cree le : mercredi 09 novembre 2011 à 23 : 56.
* Auteurs : Axel MOINET et Arnaud DURAND.
* 
* Nom de fichier : taskpsumsmax.cpp
* Chemin du fichier : ./src/classes/taskpsumsmax/taskpsumsmax.cpp
* 
* Description :
* 
*/

#include "taskpsumsmax.h"

taskPsumSmax::taskPsumSmax(tbb::concurrent_vector<int> *p_cgh, tbb::concurrent_vector<int> *p_psum, tbb::concurrent_vector<int> *p_smax) {
	this->cgh = p_cgh;
	this->psum = p_psum;
	this->smax = p_smax;
}

taskPsumSmax::~taskPsumSmax() {

}

tbb::task* taskPsumSmax::execute() {
	this->computePSUM();
	this->computeSMAX();
	return NULL;
}

int taskPsumSmax::computePSUM() {
	this->tabSize = (*(this->cgh)).size();

	this->psum->grow_by(this->tabSize);
	(*(this->psum))[0] = (*(this->cgh))[0];

	for(int i=1; i < this->tabSize; i++) {
		(*(this->psum))[i] = (*(this->psum))[i-1] + (*(this->cgh))[i];
	}

	return 0;
}

int taskPsumSmax::computeSMAX() {
	this->smax->grow_by(this->tabSize);

	(*(this->smax))[this->tabSize - 1] = (*(this->psum))[this->tabSize - 1];

	for(int i=this->tabSize-2; i >= 0; i--) {
		if((*(this->psum))[i] > (*(this->smax))[i+1]) {
			(*(this->smax))[i] = (*(this->psum))[i];
		}
		else {
			(*(this->smax))[i] = (*(this->smax))[i+1];
		}
	}

	return 0;
}
